#ifndef __SE_THREAD_POOL_HPP__
#define __SE_THREAD_POOL_HPP__

#include "Thread.hpp"
#include "TaskQueue.hpp"

#include <queue>
#include <functional>
#include <memory>

namespace se {

class ThreadPool {
    using Task = std::function<void()>;
public:
    ThreadPool(size_t threadCount, size_t taskQueueCapacity);
    ~ThreadPool();

    /**
     * @brief 开始运行线程池
     * 
     */
    void start();

    /**
     * @brief 停止运行线程池
     * 
     */
    void stop();

    /**
     * @brief 增加任务
     * 
     * @param task 
     */
    void addTask(Task task);

private:
    /**
     * @brief 获取任务
     * 
     * @return Task 
     */
    Task getTask();

    /**
     * @brief 线程池线程执行函数体
     * 
     */
    void threadFunction();

private:
    bool _isExit;
    size_t _threadCount;
    size_t _taskQueueCapacity;
    TaskQueue<Task> _taskQueue;
    std::vector<std::unique_ptr<Thread>> _threads;
};

}  // namespace se

#endif
